
#include "main.h"
 
#include "Public.h"


//74HC165 /串行数据输入DATA PC13  / 移位寄存器时钟输入CP PC14 / 存储寄存器时钟输入LATCH1 PC15


#define Q165_PORT   	   GPIOB
#define Q165_PIN        GPIO_Pin_4

#define INPUT_Q165    GPIO_ReadInputDataBit( Q165_PORT, Q165_PIN)


#define CP165_PORT   	   GPIOB
#define CP165_PIN        GPIO_Pin_3

#define CP1_PIN_0 GPIO_ResetBits(CP165_PORT, CP165_PIN)
#define CP1_PIN_1 GPIO_SetBits(CP165_PORT, CP165_PIN)


#define PL165_PORT   	   GPIOA
#define PL165_PIN        GPIO_Pin_15

#define PL1_PIN_0 GPIO_ResetBits(PL165_PORT, PL165_PIN)
#define PL1_PIN_1 GPIO_SetBits(PL165_PORT, PL165_PIN)




void Key_log(  void );
unsigned char read74HC165(void); 

// 从74HC165读取一个字节的数据  
unsigned char read74HC165(void) 
{  
    u16 data;  
    unsigned char i;  

    // 发送ST_CP的上升沿，以加载数据到输出寄存器
    CP1_PIN_1; 
    data = 0x00;     
    PL1_PIN_1;    // LOAD引脚置高
    delay_us(10); // 短暂延时     
    PL1_PIN_0;   // 拉低LOAD引脚
    delay_us(10); // 短暂延时 
    PL1_PIN_1;    // LOAD引脚置高
    delay_us(10); // 短暂延时     
    // 读取8位数据  

    for (i = 0; i < 8; i++) 
    {      
      CP1_PIN_0;
      delay_us(5); // 短暂延时       
      data=data<<1;
      // 发送SH_CP的上升沿，以移位输出数据
      if (INPUT_Q165!=0) 
      {  
          // QH'为高，表示当前位是1  
          data |= 1; // 设置相应的位  
      } 
 
      CP1_PIN_1;  
      delay_us(5); // 短暂延时        
      
      // 在实际中，可能需要一个额外的位操作来读取这个引脚 
    }  

    return data;  
}  




void Key_log(  void )
{

static u16 io1H_cnt;
static u16 io1L_cnt;
static u16 io2H_cnt;
static u16 io2L_cnt;
static u16 io3H_cnt;
static u16 io3L_cnt;
static u16 io4H_cnt;
static u16 io4L_cnt;
static u16 io5H_cnt;
static u16 io5L_cnt;
static u16 io6H_cnt;
static u16 io6L_cnt;  
  

  u8 noise_time;//防抖时间
  u16 long_time;
  
  noise_time=5; //防抖时间
  long_time=500;//5s


  if((KEYS_REG&0x01)==0)
  {
    io1H_cnt++;
    if(io1H_cnt==noise_time)
    {
      io1L_cnt=0;
      key1_status=1;
    }
    if(io1H_cnt==long_time)
    {
      io1H_cnt=long_time+1;
      key1_long_event=1;
    }    
    if(io1H_cnt>=long_time)
    {
      io1H_cnt=long_time+1;
    }    
  }
  else
  {
    io1L_cnt++;
    if(io1L_cnt==noise_time)
    {
      if(io1H_cnt>=noise_time && io1H_cnt<long_time)
      {
        key1_event=1;         
      }      
      io1H_cnt=0;      
      io1L_cnt=noise_time+1;
      key1_status=0;
    } 
    if (io1L_cnt>=noise_time+1)
    {
      io1H_cnt=0;         
      io1L_cnt=noise_time+1;
    } 
  }  
  
  if((KEYS_REG&0x02)==0)
  {
    io2H_cnt++;
    if(io2H_cnt==noise_time)
    {
      io2L_cnt=0;
      key2_status=1;
    }
    if(io2H_cnt==long_time)
    {
      io2H_cnt=long_time+1;
      key2_long_event=1;
    }    
    if(io2H_cnt>=long_time)
    {
      io2H_cnt=long_time+1;
    }    
  }
  else
  {
    io2L_cnt++;
    if(io2L_cnt==noise_time)
    {
      if(io2H_cnt>=noise_time && io2H_cnt<long_time)
      {
        key2_event=1;         
      }      
      io2H_cnt=0;      
      io2L_cnt=noise_time+1;
      key2_status=0;
    } 
    if (io2L_cnt>=noise_time+1)
    {
      io2H_cnt=0;         
      io2L_cnt=noise_time+1;
    } 
  }  
  
  
  
  if((KEYS_REG&0x04)==0)
  {
    io3H_cnt++;
    if(io3H_cnt==noise_time)
    {
      io3L_cnt=0;
      key3_status=1;
    }
    if(io3H_cnt==long_time)
    {
      io3H_cnt=long_time+1;
      key3_long_event=1;
    }    
    if(io3H_cnt>=long_time)
    {
      io3H_cnt=long_time+1;
    }    
  }
  else
  {
    io3L_cnt++;
    if(io3L_cnt==noise_time)
    {
      if(io3H_cnt>=noise_time && io3H_cnt<long_time)
      {
        key3_event=1;         
      }      
      io3H_cnt=0;      
      io3L_cnt=noise_time+1;
      key3_status=0;
    } 
    if (io3L_cnt>=noise_time+1)
    {
      io3H_cnt=0;         
      io3L_cnt=noise_time+1;
    } 
  }  

  
  if((KEYS_REG&0x08)==0)
  {
    io4H_cnt++;
    if(io4H_cnt==noise_time)
    {
      io4L_cnt=0;
      key4_status=1;
    }
    if(io4H_cnt==long_time)
    {
      io4H_cnt=long_time+1;
      key4_long_event=1;
    }    
    if(io4H_cnt>=long_time)
    {
      io4H_cnt=long_time+1;
    }    
  }
  else
  {
    io4L_cnt++;
    if(io4L_cnt==noise_time)
    {
      if(io4H_cnt>=noise_time && io4H_cnt<long_time)
      {
        key4_event=1;         
      }      
      io4H_cnt=0;      
      io4L_cnt=noise_time+1;
      key4_status=0;
    } 
    if (io4L_cnt>=noise_time+1)
    {
      io4H_cnt=0;         
      io4L_cnt=noise_time+1;
    } 
  }    


  if((KEYS_REG&0x20)==0)
  {
    io5H_cnt++;
    if(io5H_cnt==noise_time)
    {
      io5L_cnt=0;
      key5_status=1;
    }
    if(io5H_cnt==long_time)
    {
      io5H_cnt=long_time+1;
      key5_long_event=1;
    }    
    if(io5H_cnt>=long_time)
    {
      io5H_cnt=long_time+1;
    }    
  }
  else
  {
    io5L_cnt++;
    if(io5L_cnt==noise_time)
    {
      if(io5H_cnt>=noise_time && io5H_cnt<long_time)
      {
        key5_event=1;         
      }      
      io5H_cnt=0;      
      io5L_cnt=noise_time+1;
      key5_status=0;
    } 
    if (io5L_cnt>=noise_time+1)
    {
      io5H_cnt=0;         
      io5L_cnt=noise_time+1;
    } 
  }  
  
  if((KEYS_REG&0x10)==0)
  {
    io6H_cnt++;
    if(io6H_cnt==noise_time)
    {
      io6L_cnt=0;
      key6_status=1;
    }
    if(io6H_cnt==long_time)
    {
      io6H_cnt=long_time+1;
      key6_long_event=1;
    }    
    if(io6H_cnt>=long_time)
    {
      io6H_cnt=long_time+1;
    }    
  }
  else
  {
    io6L_cnt++;
    if(io6L_cnt==noise_time)
    {
      if(io6H_cnt>=noise_time && io6H_cnt<long_time)
      {
        key6_event=1;         
      }      
      io6H_cnt=0;      
      io6L_cnt=noise_time+1;
      key6_status=0;
    } 
    if (io6L_cnt>=noise_time+1)
    {
      io6H_cnt=0;         
      io6L_cnt=noise_time+1;
    } 
  }     
  

  
  if(flush_status!=0)
  {
//    key1_status=0;        //   按钮状态
//    key1_event=0;        //   按钮触发事件
    key1_long_event=0;        //   按钮长按事件避免冲洗时又强制冲洗
//    in_ch1_event=0;
//    in_ch2_event=0;    
  }
  
  
  
  
  
  
  
  
  
  

}



// 主函数  
void key(void) 
{  
  if( gc.u8Scan_key_1ms_cnt<10 )
  {  return; }      
  gc.u8Scan_key_1ms_cnt =0;    
  

    KEYS_REG = read74HC165();  
    
    

    Key_log();
    

//----------------------------------------------    
}  
  
// 注意：上面的QH_PIN读取逻辑是简化的，并且假设QH'引脚直接连接到单片机的输入引脚  
// 在实际应用中，由于QH'是Q7的反相输出，它可能不是直接用于串行读取的最后一个数据位  
// 因此，你可能需要根据你的具体硬件连接来调整读取逻辑









//
//#define KEY1_GPIO_Port   GPIOB
//#define KEY1_Pin         GPIO_Pin_5 
//
//#define KEY2_GPIO_Port   GPIOB
//#define KEY2_Pin         GPIO_Pin_3 
//
//#define KEY3_GPIO_Port   GPIOB
//#define KEY3_Pin         GPIO_Pin_4
//
//#define read_key1    GPIO_ReadInputDataBit( KEY1_GPIO_Port, KEY1_Pin  )
//#define read_key2    GPIO_ReadInputDataBit( KEY2_GPIO_Port, KEY2_Pin  )
//#define read_key3    GPIO_ReadInputDataBit( KEY3_GPIO_Port, KEY3_Pin  ) 
//
////--------test_control   遥控开关 PA 2---------------------
//#define read_test     GPIO_ReadInputDataBit( GPIOB, GPIO_Pin_9  ) 
//
//
////--------remote_control   测试开关 PC13---------------------
//#define Remote_GPIO_Port   GPIOC
//#define Remote_Pin         GPIO_Pin_13
//#define read_Remote      GPIO_ReadInputDataBit( Remote_GPIO_Port, Remote_Pin  ) 
//
////--------Pro_t   温度开关 PC14---------------------
//#define Pro_t_GPIO_Port   GPIOC
//#define Pro_t_Pin         GPIO_Pin_14
//#define read_Pro_t      GPIO_ReadInputDataBit( Pro_t_GPIO_Port, Pro_t_Pin  ) 
//
//
////--------Stop     PC14---------------------
//#define Stop_GPIO_Port   GPIOC
//#define Stop_Pin         GPIO_Pin_13
//#define read_Stop      GPIO_ReadInputDataBit( Stop_GPIO_Port, Stop_Pin  ) 
////
//////-------- Start    PC13---------------------
////#define Start_GPIO_Port   GPIOC
////#define Start_Pin         GPIO_Pin_14
////#define read_Start      GPIO_ReadInputDataBit( Start_GPIO_Port, Start_Pin  ) 
//
//
